package co.edu.usbcali.modelo.control;

import co.edu.usbcali.dataaccess.api.Conexion;
import co.edu.usbcali.modelo.Foto;
import co.edu.usbcali.presentation.backingBeans.EventosView;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

public class Archivos extends Conexion {

    public void guardarArchivo(List<FileUploadEvent> file, Long idEvento) throws Exception {
        InputStream entrada = null;

        PreparedStatement pst = null;
        try {

            String insert;

            establecerConexion();
            getCon().setAutoCommit(false);

            insert = "Insert into IMAGENES (ID_IMAGEN,NOMBRE_ARCHIVO,BIN,EVENTOSID_EVENTO) values(?,?,?,?)";

            pst = getCon().prepareStatement(insert);
            
            for (FileUploadEvent file1 : file) {
                entrada = file1.getFile().getInputstream();
                Long idImagen = 0L;
                pst.setLong(1, idImagen);
                pst.setString(2, file1.getFile().getFileName().toUpperCase());
                pst.setBinaryStream(3, entrada, entrada.available());
                pst.setLong(4, idEvento);
                pst.executeUpdate();
                getCon().commit();
            } 

        } catch (SQLException | IOException e) {
            pst.close();
            entrada.close();
            throw e;
        }
        cerrarConexion();
    }

    public List<StreamedContent> obtenerArchivo(Long idEvento) throws Exception {
        InputStream salida = null;
        List<StreamedContent> imagenes = new ArrayList<StreamedContent>();
        try {
            PreparedStatement pst;
            ResultSet rs;

            //FileOutputStream archivoSalida;
            String select;

            //byte[] arreglo;
            //int byteLeidos = 0;
            establecerConexion();
            getCon().setAutoCommit(false);
            select = "select BIN,NOMBRE_ARCHIVO from IMAGENES WHERE EVENTOSID_EVENTO=?";
            pst = getCon().prepareStatement(select);
            pst.setLong(1, idEvento);

            rs = pst.executeQuery();

            while (rs.next()) {

                InputStream inputStream;
                try {
                    inputStream = rs.getBlob(1).getBinaryStream();
                    byte[] inputStreamBytes;
                    inputStreamBytes = IOUtils.toByteArray(inputStream);
                    imagenes.add(new DefaultStreamedContent(new ByteArrayInputStream(inputStreamBytes), "image/jpg", rs.getString(2)));
                } catch (Exception ex) {
                    Logger.getLogger(EventosView.class.getName()).log(Level.SEVERE, null, ex);
                }
                //salida = blob.getBinaryStream();

                //arreglo = new byte[2048];
                //archivoSalida = new FileOutputStream(idEvento + 1 + "");
                //while ((byteLeidos = salida.read(arreglo)) > 0) {
                //  archivoSalida.write(arreglo, 0, byteLeidos);
                //}
                //BufferedImage img = ImageIO.read(blob.getBinaryStream());
            }

        } catch (SQLException ex) {
            throw ex;
        } finally {
            try {
                if (salida != null) {
                    salida.close();
                }
            } catch (IOException ex) {
                throw ex;
            }
        }
        return imagenes;
    }

    public Blob obtenerArchivo1(Long idEvento) throws Exception {

        //List<StreamedContent> imagenes = new ArrayList<StreamedContent>();
        try {
            PreparedStatement pst;
            ResultSet rs;

            //FileOutputStream archivoSalida;
            String select;

            //byte[] arreglo;
            //int byteLeidos = 0;
            establecerConexion();
            getCon().setAutoCommit(false);
            select = "select BIN,NOMBRE_ARCHIVO from IMAGENES WHERE ID_IMAGEN=?";
            pst = getCon().prepareStatement(select);
            pst.setLong(1, idEvento);

            rs = pst.executeQuery();

            while (rs.next()) {
                Blob blob = rs.getBlob(1);
                System.out.println(rs.getString(2));
                //salida = blob.getBinaryStream();

                return blob;

                //arreglo = new byte[2048];
                //archivoSalida = new FileOutputStream(idEvento + 1 + "");
                //while ((byteLeidos = salida.read(arreglo)) > 0) {
                //  archivoSalida.write(arreglo, 0, byteLeidos);
                //}
                // InputStream dbStream =new BufferedInputStream(blob.getBinaryStream());
                //StreamedContent dbImage = new DefaultStreamedContent(dbStream, "image/jpeg");
                //BufferedImage img = ImageIO.read(blob.getBinaryStream());
                //imagenes.add(dbImage);
            }

        } catch (SQLException ex) {
            throw ex;
        }
        return null;
    }

    public List<Foto> getImagenesPorEvento(long idEvento) throws Exception {
        List<Foto> fotos = new ArrayList<Foto>();
        try {
            PreparedStatement pst;
            ResultSet rs;
            establecerConexion();
            getCon().setAutoCommit(false);
            String select = "select * from IMAGENES WHERE EVENTOSID_EVENTO=?";
            pst = getCon().prepareStatement(select);
            pst.setLong(1, idEvento);

            rs = pst.executeQuery();

            while (rs.next()) {

            Foto foto = new Foto();
            foto.setId(rs.getLong("ID_IMAGEN"));
            foto.setImagen(rs.getBytes("BIN"));
            foto.setNombre(rs.getString("NOMBRE_ARCHIVO"));
            fotos.add(foto);
            }

        } catch (SQLException ex) {
            throw ex;
        }
        
        cerrarConexion();
        
        return fotos;
    }
}
